Форум dkLab и Denwer
Здесь общаются Web-разработчики.
Генеральный спонсор:
Хостинг «Джино»

_correctSuperglobals (ewgraf)
Author Message
ewgraf
Заглянувший



Joined: 20 Jun 2007
Posts: 2
Карма: 0
   поощрить/наказать


PostPosted: Wed Jun 20, 2007 9:54 am (написано за 4 минуты 11 секунд)
   Post subject: _correctSuperglobals
Reply with quote

Здравствуйте! Есть вопрос по функции _correctSuperglobals

1. Зачем там корректировать $_GET массив? PHP его сам отлично парсит, даже если данные были переданы через HTTP_RAW_POST_DATA.
2. Зачем преобразовывать символы вида %xx в %uxxxx? Насколько я понял в HTTP_RAW_POST_DATA уже символы преобразованы в %uxxxx на стороне клиента.

У меня кусочек этой функции выглядит как:
Code (php): скопировать код в буфер обмена
$source = array (www.php.net/array)(
//            '_GET' => !empty($_SERVER['QUERY_STRING'])? $_SERVER['QUERY_STRING'] : null,
            '_POST'=> !empty (www.php.net/empty)($GLOBALS['HTTP_RAW_POST_DATA'])? $GLOBALS['HTTP_RAW_POST_DATA'] : null
        );
        foreach ($source as $dst=>$src) {
            $data = null;
            parse_str (www.php.net/parse_str)($src, $data);
            $GLOBALS[$dst] = $this->_ucs2EntitiesDecode($data);
        }
Чем это грозить может, какими сбоями?


Эти изменения внес после того как я передавал $_GET данные в UTF-8 кодировке то есть один символ представлял два %xx%xx и соответственно библиотека преобразовывала это в %uxxx%uxxxx и считала что это два символа.
Back to top
View user's profile Send private message
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 413
   поощрить/наказать


PostPosted: Wed Jun 20, 2007 11:33 pm (спустя 13 часов 38 минут; написано за 3 минуты 58 секунд)
   Post subject:
Reply with quote

К сожалению, это необходимо в связи с особенностью работы функции JavaScript escape().
Она передает данные в Unicode (UCS-2BE), закодированные в виде %uABCD, где ABCD - 16-ричный код. Причем символ "%" она передает как "%25", а не как "%u0025".

Представьте теперь, что пришли такие данные:

"%25uABCD%uABCD"

Если их отдать PHP на декодирование, то получится следующая строка: "%uABCD%uABCD", которая затем декодируется в 2 символа с кодами ABCD.
Но это, очевидно, неправильно, т.к. после всех декодирований должна была получиться строка "%uABCD*" (где "*" - это я так обозначил символ с Unicode-кодом ABCD).

Если непонятно, попробуйте перечитать данное описание несколько раз до полного просветления.
Back to top
View user's profile Send private message Send e-mail
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 413
   поощрить/наказать


PostPosted: Wed Jun 20, 2007 11:35 pm (спустя 2 минуты; написано за 1 минуту 5 секунд)
   Post subject:
Reply with quote

ewgraf wrote:
Эти изменения внес после того как я передавал $_GET данные в UTF-8 кодировке
Зачем Вы это делали? При работе с JsHttpRequest Вам вообще не нужно думать о кодировках: забудьте о них, передавайте обычные JavaScript-строки вторым параметром в query(), как будто никаких кодировок и не существует вовсе. Остальное сделает библиотека.
Back to top
View user's profile Send private message Send e-mail
ewgraf
Заглянувший



Joined: 20 Jun 2007
Posts: 2
Карма: 0
   поощрить/наказать


PostPosted: Thu Jun 21, 2007 7:34 am (спустя 7 часов 58 минут; написано за 1 минуту 52 секунды)
   Post subject:
Reply with quote

Спасибо, теперь понял. Просто я для минимизации кода включал _GET данные в URL напрямую, чтобы вставить в href, а в onclick просто использовал this.href и тоже подставлял в URL, то есть _GET данные передавал через саму ссылку, в обход библиотеки.
Back to top
View user's profile Send private message
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 413
   поощрить/наказать


PostPosted: Thu Jun 21, 2007 3:03 pm (спустя 7 часов 29 минут; написано за 2 минуты 8 секунд)
   Post subject:
Reply with quote

Напрямую GET-данные из JS в PHP без ухищрений передать не получится, потому что JS "ничего не знает" про кодировки, а работает исключительно в Unicode. Есть, конечно, функция encodeURIComponent(), но она, во-первых, преобразует только в UTF-8, а во-вторых, в IE 5.0 ее нет.

Вот как раз JsHttpRequest на себя берет грязную работу по прозрачному перекодированию, так что можно работать в "родных" кодировках как во frontend, так и в backend, ни о чем не задумываясь.
Back to top
View user's profile Send private message Send e-mail
Display posts from previous:   
Post new topic   Reply to topic All times are GMT + 3 Hours
Page 1 of 1    Email to a Friend.
Post a reply
Username
Subject
Господа спамеры и оптимизаторы!

Вы можете даже и не пытаться вставлять в текст поста ссылки - они все равно автоматически удаляются (вернее, тэги <a> заменяются на тэги <u>).

Но если не поверите и все же попытаетесь - как только увидите, что все безрезультатно, удалите свой пост, пожалуйста. Модераторы тоже люди, нехорошо, если они погрязнут в тоннах спама.
     

Disable BBCode in this post
Disable Smilies in this post
    HTML is OFF
BBCode is ON
Smilies are ON
You cannot post new topics in this forum. You can reply to topics in this forum. You cannot edit your posts in this forum. You cannot delete your posts in this forum. You cannot vote in polls in this forum. You cannot attach files in this forum. You can download files in this forum.
XML